/*
 * @Author: lei
 * @Description: 
 * @FilePath: \code\signleton1.h
 */
//最简单的单例模式：第一次用到类实例的时候才会去实例化，就是懒汉实现。非线程安全；

//将构造函数声明为private或protect防止被外部函数实例化，
//内部有一个静态的类指针保存唯一的实例，实例的实现由一个public方法来实现，该方法返回该类的唯一实例。

//缺点：当多线程时，是不安全的。考虑两个线程同时首次调用instance方法且同时检测到p是nullptr，则两个线程会同时构造一个实例给p，这将违反了单例的准则。
class Singleton {
public:
	static Singleton* GetInstance();
private:
	Singleton() = default;
	static Singleton *p;
};

Singleton* Singleton::p = nullptr;
Singleton* Singleton::GetInstance() {
	if(p == nullptr)
		p = new Singleton();
	return p;
}
